package 稀疏数组;

public class 稀疏数组 {
	public static void main(String[] args) {
		// 先创建二维数组
		int[][] arr = new int[3][6];
		arr[0][1] = 1;
		arr[1][2] = 2;
		// 输出二维数组
		for (int[] i : arr) {
			for (int j : i) {
				System.out.print(j + " ");
			}
			System.out.println();
		}
		/*
		 0 1 0 0 0 0 
		 0 0 2 0 0 0 
		 0 0 0 0 0 0 
		 */
		
		//创建稀疏数组
		//1.循环二维数组得到 行 列  有效数字
		int sum = 0;
		for(int i = 0 ; i < arr.length ; i++) {
			for(int j = 0; j < arr[i].length ; j++) {
				if(arr[i][j] != 0) {
					sum++;
				}
			}
		}
		//有效个数 、行、 列
		//System.out.println(sum);
		//System.out.println(arr.length +":"+arr[0].length);
		
		//2.创建稀疏数组 赋值
		
		//稀疏数组是固定列，sum + 1 行，因为第一行记录数组信息
		int[][] sparseArr = new int[sum + 1][3];
		//记录行和列，也可以直接赋给 固定值
		sparseArr[0][0] = arr.length; //3
		sparseArr[0][1] = arr[0].length; //6
		sparseArr[0][2] = sum;
		
		//开始赋值
		//记录第几个有效数字，就是稀疏数组中第几行
		int count = 0;
		for(int i = 0 ; i < arr.length ; i++) {
			for(int j = 0 ; j < arr[0].length ; j++) {
				if(arr[i][j] != 0) {
					count++;
					//注意count只是在稀疏数组中的第几行，不代表二维数组中的第几行
					sparseArr[count][0] = i;
					sparseArr[count][1] = j;
					sparseArr[count][2] = arr[i][j];
 				}
			}
		}
		
		//输出稀疏数组
		System.out.println("---------稀疏数组----------");
		//这种遍历适合 列 比较少的数组
		for(int i = 0 ; i < sparseArr.length ; i++) {
			System.out.println(sparseArr[i][0] +" "+ sparseArr[i][1] +" "+ sparseArr[i][2]);
		}
		/*
		 3 6 2
		 0 1 1
		 1 2 2
		 */
		
		//稀疏数组还原二维数组
		
		//通过第一行创建二维数组
		int[][] arr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
		for(int i = 1 ; i < sparseArr.length ; i++) {
			//这里不能再循环了，因为不需要具体的值，只需要稀疏数组的一行
			
			//第一行 的第一列是二维数组的行，第二列是二维数组的列，第三列是二维数组的值
			arr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
		}
		
		//输出还原后的二维数组
		System.out.println("---------还原后的二维数组----------");
		for(int i = 0 ; i < arr2.length ; i++) {
			for(int j = 0 ; j < arr2[0].length ; j++) {
				System.out.print(arr2[i][j] + " ");
			}
			System.out.println();
		}
		
		/*
		  0 1 0 0 0 0 
		  0 0 2 0 0 0 
		  0 0 0 0 0 0 
		 */
	}
}
